package com.woniuxy.utils;

import java.util.Random;

/**
 * 基于手机号生成确定性验证码的工具类
 * <p>
 * 该工具类用于生成在特定时间段内（例如一分钟）对同一手机号是固定的验证码。
 * 主要原理是使用手机号的哈希值结合当前时间的分钟数作为随机数生成器的种子。
 * 适用于需要可预测验证码的测试场景或特定业务需求。
 * </p>
 */
public final class PhoneBasedCodeUtil {

    /**
     * 私有构造函数，防止该工具类被实例化。
     */
    private PhoneBasedCodeUtil() {
        // 这是一个工具类，不应该被实例化
    }

    /**
     * 根据手机号和当前时间（精确到分钟）生成一个指定长度的纯数字验证码。
     *
     * @param phoneNumber 手机号码，用于生成种子的关键部分。
     * @param length      验证码的长度，必须大于0。
     * @return 根据手机号和当前分钟生成的确定性数字字符串。
     * @throws IllegalArgumentException 如果手机号为空或长度小于等于0。
     */
    public static String generateCode(String phoneNumber, int length) {
        if (phoneNumber == null || phoneNumber.isEmpty()) {
            throw new IllegalArgumentException("手机号不能为空 (Phone number cannot be null or empty)");
        }
        if (length <= 0) {
            throw new IllegalArgumentException("验证码长度必须大于0 (Length must be greater than 0)");
        }

        // 1. 获取当前时间的分钟数，这样可以保证验证码每分钟变化一次
        long currentMinute = System.currentTimeMillis() / (1000 * 60);

        // 2. 使用手机号的哈希值和当前分钟数混合，创建一个稳定的种子
        long seed = phoneNumber.hashCode() + currentMinute;

        // 3. 使用这个种子初始化 Random 对象
        Random random = new Random(seed);

        // 4. 生成指定长度的验证码
        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            sb.append(random.nextInt(10));
        }
        return sb.toString();
    }

    /**
     * 根据手机号生成一个标准的6位纯数字验证码。
     * <p>
     * 在同一分钟内，相同的手机号会得到相同的验证码。
     * </p>
     *
     * @param phoneNumber 手机号码。
     * @return 一个6位长度的、基于手机号和当前分钟生成的确定性数字字符串。
     */
    public static String generate6DigitCode(String phoneNumber) {
        return generateCode(phoneNumber, 6);
    }
}
